/*
  Classe para conecção em Bancos de Dados
  Autor: Alcione Ferreira
  Criado em 03/07/2012
  Revisado em 03/07/2012

  ****************************************

  Class for connection to Database
  Author: Alcione Ferreira
  Created 03/07/2012
  Revised 03/07/2012
*/

#include <bancosl.h>

BANCOSL::BANCOSL(const char *arq_conf)
  	{
	this->conn = NULL;
	this->result = 0;
	this->arquivo = new char[strlen(arq_conf)+1];
	strcpy(this->arquivo,arq_conf);
  	this->conectar();
  	}

BANCOSL::~BANCOSL()
  	{
	if (this->conectado == 1)
		{
  		sqlite3_close(this->conn);
		}
  	}

void BANCOSL::conectar()
  	{
  	this->mensagem.clear();
    if (sqlite3_open(this->arquivo, &this->conn) == SQLITE_OK)
    	{
		this->conectado = 1;
        this->mensagem.append("Conectado com sucesso!");
        }
    else
        {
		this->conectado = 0;
		this->mensagem.append("Falha ao conectar!\n");
        this->mensagem.append("Erro: ");
		this->mensagem.append(sqlite3_errmsg(this->conn));
        }
	 }

void BANCOSL::executar(char *query, int tipo)
  	{
	int i;
	sqlite3_stmt *statement;
	vector<string> valores;
	string AUX;
	//cout << query << endl;
  	this->mensagem.clear();
  	if (this->conectado)
		{
		if (sqlite3_prepare_v2(this->conn, query, -1, &statement, 0) == SQLITE_OK)
			{
			switch (tipo)
				{
			  	case 1:
					{
					this->query_result = 1;
					break;
					}
			  	case 2:
					{
					this->query_result = 2;
					this->result = 0;
					this->registros = 0;
					this->colunas = sqlite3_column_count(statement);
					this->resultados.clear();
					break;
					}
				}
			while(true)
				{
				this->result = sqlite3_step(statement);
				if (this->result == SQLITE_ROW)
					{
					valores.clear();
					//cout << colunas << endl;
					for (i=0; i < this->colunas; i++)
						{
						AUX.clear();
						if ((char*)sqlite3_column_text(statement, i) != NULL)
							{
							AUX.append((char*)sqlite3_column_text(statement, i));
							}
						else
							{
							AUX.append("");
							}
						valores.push_back(AUX);
						}
					this->resultados.push_back(valores);
					this->registros++;
					}
				else
					{
					break;
					}
				}
			sqlite3_finalize(statement);
			}
		else
			{
			this->query_result = 3;
			this->mensagem.append("Erro: ");
			this->mensagem.append(sqlite3_errmsg(this->conn));
			}
		}
  	}
